// 导入axios
import Vue from "vue";
import axios from "axios";
import VueAxios from "vue-axios";
import { getToken, saveToken } from "./token.js";
import { Toast } from "vant";
import router from "@/router/index.js";
// 导入jsonbigint 来解决大数丢失精度问题
import JSONbig from "json-bigint";

Vue.use(VueAxios, axios);

const instance = axios.create({
  baseURL: "http://toutiao-app.itheima.net", // 线上基地址
  timeout: 10000, // 设置网络超时
  transformResponse: [
    // `transformResponse` 在传递给 then/catch 前，允许修改响应数据
    //  这里使用JOSNbig转换 因为使用原生方法转换的话 大数精准度会丢失
    function(data) {
      // 对 data 进行任意转换处理
      try {
        // 使用JOSNbig转换
        return JSONbig.parse(data);
      } catch (err) {
        return data;
      }
    }
  ]
});

// 添加请求拦截器
instance.interceptors.request.use(
  function(config) {
    // console.dir(config.headers);
    // 在发送请求之前做些什么
    if (getToken()) {
      // 如果有token 就默认在请求头添加token
      //config.headers = { Authorization: `Bearer ${getToken().token}` };
      config.headers.Authorization = "Bearer " + getToken().token;
    }
    return config;
  },
  function(error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
instance.interceptors.response.use(
  function(response) {
    // 对响应数据做点什么
    return response;
  },
  async function(error) {
    // 对响应错误做点什么
    // 判断错误信息是不是401
    console.dir(error);
    // 判断错误码是不是401
    if (error.response && error.response.status == 401) {
      setTimeout(() => {
        console.clear();
      }, 1000);
      // 是401 判断用户有没有token
      if (getToken()) {
        try {
          // 有token 代表用户已经登录 但是token过期了
          // 刷新token
          const res = await axios({
            url: "http://toutiao-app.itheima.net/v1_0/authorizations",
            method: "put",
            headers: { Authorization: `Bearer ${getToken().refresh_token}` }
          });
          // console.log(res)
          // 将后台返回的刷新的token存起来
          saveToken({
            refresh_token: getToken().refresh_token,
            token: res.data.data.token
          });

          // console.log(error.config);
          // 将数据返回给服务器 继续发送请求
          // 如果不返回的话 用户修改个人信息会出现bug 影响用户体验
          return instance(error.config);
        } catch (error) {
          // 刷新失败 说明refresh_token 也过期了 需要重新登陆
          Toast.fail("请重新登录");
          router.push({ path: "/login" });
        }
      } else {
        // 没有token 要提示用户登录
        Toast.fail("请先登录");
        router.push({ path: "/login" });
      }
    }

    return Promise.reject(error);
  }
);

export default instance;
